/* 
类型别名: 
  给特定的值或类型通过 type 来指定其别名, 后面通过别名来代表这个值或类型
  类型别名并没有定义新的类型, 而只是为了方便使用取的友好名称
*/
(() => {
  
    /* 值类型别名 */

  // 要求status值只能是1/2/3
  let status: 1|2|3 = 1  
  // status = 4  // error
  let status2: 1|2|3 = 2
  // 给多个可选的值类型定义一个类型别名
  type Status = 1|2|3
  let status3: Status = 3  // 语义化更好, 更简洁
  // status3 = 4 // error

  /* 类型别名 */
  // key的值可以是数值出可以是字符串
  let key: string|number = 'abc'
  key = 123
  // key = true  // error
  // 定义类型别名
  type Key = string|number
  let key2: Key = 'cba'
  key2 = 123
  // key = {} // error

  /* 类型别名并没有定义新的类型, 而只是为了方便使用取的友好名称 */
  interface User {
    name: string
    age: number
  }

  // 不使用类型别名
  let users: User[] = [
    {name: 'tom', age: 12},
    {name: 'tom2', age: 13},
  ]
  type Users = User[]
  // 使用类型别名
  let users2: Users = [
    {name: 'tom', age: 12},
    {name: 'Jack', age: 13},
  ]

})()